home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / ctutord.EXE / POINTERS.C < prev    next >
C/C++ Source or Header  |  1990-10-25  |  3KB  |  69 lines

  1. /*
  2. Remember the rules of precedence. For the operators ++, --,  and the
  3. pointer reference for indirection *, precedence is from right to left.
  4. When one of those operators is detected by the compiler, the compiler
  5. will determine whether indirection is required. The following cases
  6. using a pointer to an integer help to illustrate this point:
  7.  
  8. Given the following definitions:
  9.  
  10.     int  *p, i;
  11.     i=99; p=&i;
  12.  
  13. The compiler determines the operation to be performed:
  14.  
  15. *p    Access the contents of i via the pointer p 
  16. ++p   Increment p to point to the next integer
  17. p     Access the address stored in p
  18. ++*p  Increment the contents of i via the pointer p before referencing
  19. *++p  Increment p to point to the next integer, then reference the
  20.       integer.
  21. *p++  Increment p to point to the next integer, after the current
  22.       integer pointed to by p is referenced.
  23. p++*  ILLEGAL unless * is used to multiply the pointer value
  24. p*++  ILLEGAL
  25. */
  26.  
  27. main()
  28. {
  29.     int i, j, k, *p;
  30.     static int array[]= { 1,2,3 };
  31.  
  32.     j=999; k=1234; i=9; p=&i;
  33.  
  34.     printf("%d\n",i++);  /* prints: 9 */
  35.     printf("%d\n",*p);   /* prints: 10 */
  36.     printf("%d\n",++*p); /* prints: 11 */
  37.     printf("%d\n",*++p); /* prints: 999, First, p gets incremented to point 
  38.                         to the next integer. This just happens to be j since j
  39.                         is defined after i. Then the contents of integer
  40.                         j would be passed to printf(). This is the makings
  41.                         of a major bug. This is shown only to illustrate
  42.                         how a pointer could be misused without the compiler
  43.                         catching the problem. */
  44.     printf("%d\n",*p++); /* prints: 999, p gets incremented after it passes 
  45.                         999 */
  46.  
  47. /* it just so happens that the next integer would be k, since k is defined 
  48. after j. This would normally create a bug for the programmer that could be 
  49. difficult to find. */
  50.  
  51.     printf("%d\n",*p);   /* prints: 1234, Since p was incremented on the 
  52.                         previous line, the pointer was incremented to point 
  53.                         to the next integer. This just happens to be the 
  54.                         integer k - watch out for bugs like these! */
  55.  
  56.     /* ERROR printf("%d\n",p++*);  */
  57.     /* ERROR printf("%d\n",p*++);  */
  58.  
  59. /* A better utilization of pointer arithmetic could be implemented when
  60. the contents of an array are accessed.
  61. */
  62.     p=&array[0];
  63.     printf("%d\n",*p);   /* prints: 1  */
  64.     printf("%d\n",++*p); /* prints: 2  */
  65.     printf("%d\n",*++p); /* prints: 2  */
  66.     printf("%d\n",*p++); /* prints: 2  */
  67.     printf("%d\n",*p);   /* prints: 3  */
  68. }
  69.